package com.lixin.myreflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 反射
 */
public class MainApplication {
    public static void main(String[] args) {

        try {
            // 通过反射获取到User的Class对象
            Class<?> userClass = Class.forName("com.lixin.myreflect.User");
            // 使用User的无参构造器实例化一个user1对象
            User user1 = (User) userClass.newInstance();
            System.out.println(user1);
            // 获取User的setName方法
            Method setNameMethod = userClass.getDeclaredMethod("setName", String.class);
            // 调用User的setName方法
            setNameMethod.invoke(user1, "杨幂");
            System.out.println(user1);
            // 获取User的setAge方法
            Method setAgeMethod = userClass.getDeclaredMethod("setAge", int.class);
            // 调用User的setAge方法
            setAgeMethod.invoke(user1, 35);
            System.out.println(user1);

            // 获得User的有参构造器
            Constructor<?> paramConstructor = userClass.getDeclaredConstructor(String.class, int.class);
            User user2 = (User) paramConstructor.newInstance("胡歌", 30);
            System.out.println(user2);

            // 获取User的属性name
            Field nameField = userClass.getDeclaredField("name");
            // 因为name是private，无法直接访问，所以把权限检测给关闭，就可以直接访问name属性了，关闭权限检测还能大大提高性能
            nameField.setAccessible(true);
            // 设置User属性name的值
            nameField.set(user2, "李易峰");
            System.out.println(user2);
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException | NoSuchFieldException e) {
            e.printStackTrace();
        }

    }
}
